﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormConferenciaCaixa : Form
    {
        CabineVO cabineVO = null;
        UsuarioVO usuarioVO = null;

        public FormConferenciaCaixa()
        {
            InitializeComponent();
        }
        public void setCabine(CabineVO cabineVO, UsuarioVO usuarioVO)
        {
            this.cabineVO = cabineVO;
            this.usuarioVO = usuarioVO;
        }


        private void FormConferenciaCaixa_Load(object sender, EventArgs e)
        {

            StringBuilder mensagem = new StringBuilder();
            DateTime dtRef = DateTime.Now;

            mensagem.Append(Ticket.getHeader());
            mensagem.AppendLine(dtRef.ToString());
            mensagem.AppendLine("Conferencia de Caixa");
            mensagem.AppendLine("================================================");
            mensagem.AppendLine("Patio: " + cabineVO.idPatio + " - " + cabineVO.patioVO.patio);
            mensagem.AppendLine("Cabine: " + cabineVO.idCabine + " - " + cabineVO.cabine);
            mensagem.AppendLine("Operador:" + "x-xxxx");
            mensagem.AppendLine("================================================");
            mensagem.AppendLine("");

            Decimal saldo = ModelBO.getCabineSaldo(cabineVO.idCabine);
            Decimal receb = 0.0M;

            mensagem.AppendLine("Saldo anterior: " + saldo.ToString("#,##0.00").PadLeft(32, ' '));

            List<MovimentacaoVO> listMovimentacaoVOs = ModelBO.getMovimentacoes(null, cabineVO.idCabine, null, null, null, null, null, false, true, null, false, false, true, false,true);
            List<CabineXMovimentoVO> listCabineXMovimentoVO = new List<CabineXMovimentoVO>();
            foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
            {
                List<RecebimentoVO> listRecebimentoVO = ModelBO.getRecebimentos(null, movimentacaoVO.idMovimentacao, null, null, false, false, null, null, null, null);
                string movimento = "Não especificado";
                if (listRecebimentoVO.Count > 0 && listRecebimentoVO[0].formaPagamentoVO.formaPagamento != null)
                    movimento = listRecebimentoVO[0].formaPagamentoVO.formaPagamento;

                CabineXMovimentoVO cabineXMovimentoVO = listCabineXMovimentoVO.Find(cm => cm.movimento.Equals(movimento));
                if (cabineXMovimentoVO == null)
                {
                    cabineXMovimentoVO = CabineXMovimentoVO.CreateCabineXMovimentoVO();
                    cabineXMovimentoVO.movimento = movimento;
                    listCabineXMovimentoVO.Add(cabineXMovimentoVO);
                }

                cabineXMovimentoVO.credito += movimentacaoVO.valor;
                receb += movimentacaoVO.valor;
            }

            mensagem.AppendLine("Total de Recebimentos: " + receb.ToString("#,##0.00").PadLeft(25, ' '));
            mensagem.AppendLine("------------------------------------------------");
            mensagem.AppendLine("SALDO FINAL: " + (saldo + receb).ToString("#,##0.00").PadLeft(35, ' '));
            mensagem.AppendLine("");

            mensagem.AppendLine("Formas de Recebimentos");
            mensagem.AppendLine("------------------------------------------------");
            foreach (CabineXMovimentoVO cabineXMovimentoVO in listCabineXMovimentoVO)
            {
                if (cabineXMovimentoVO.credito != 0.0M)
                    mensagem.AppendLine("\t" + cabineXMovimentoVO.movimento + " " + cabineXMovimentoVO.credito.ToString("#,##0.00"));
            }
            mensagem.AppendLine("");

            List<ArrayList> listItem = new List<ArrayList>();
            foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
            {
                ArrayList item = listItem.Find(a => a.IndexOf(movimentacaoVO.especie) >= 0);
                if (item == null)
                {
                    item = new ArrayList();
                    item.Add(movimentacaoVO.especie);
                    item.Add(0.0M);
                    item.Add(0);
                    listItem.Add(item);
                }

                item[1] = (decimal)item[1] + movimentacaoVO.valor;
                item[2] = (int)item[2] + 1;
            }

            mensagem.AppendLine("Especies de Recebimentos");
            foreach (ArrayList item in listItem)
            {
                if ((decimal)item[1] != 0.0M)
                    mensagem.AppendLine("\t" + item[2] + " " + item[0] + " " + ((decimal)item[1]).ToString("#,##0.00"));
            }

            mensagem.AppendLine("");
            mensagem.AppendLine("Conferido por:");

            mensagem.Append(Ticket.getFooter(false, cabineVO, usuarioVO));

            this.textBoxResult.Text = mensagem.ToString();
        }

        private void buttonFecharJanela_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void buttonImprimir_Click(object sender, EventArgs e)
        {
            while (true)
            {
                if (!Ticket.checkPrint() || !Ticket.printTicket(this.textBoxResult.Text))
                {
                    DialogResult dr = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr.ToString().Equals("Yes"))
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }

        }

    }
}
